home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
C64
/
S-Sound and Music
/
(c)s3.d64
/
sound tut-1.c
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
2007-02-04
|
17KB
|
461 lines
0 REM" P.J.PONZO*83*WATERLOO/ONTARIO
1000 [141]60000:[153][199](142):[153]"LOAD SOUND-1"
1001 [153]"ORTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTAN^"
1002 [153]"(null) C64 SOUND WAIT (null)":MS$[178]"PONZOTUTOR"
1003 [153]"/TANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANTANEXPSTOP":[141]63100:MS$[178]" WELCOME!"
1004 [141]63100:[141]50000:[141]63000:[153]"LOADSTOP";
1010 [153]"LOADSOUND IS MADE UP OF AIR MOVEMENT,"
1020 [153]"INCREASING AND DECREASING IN PRESSURE"
1030 [153]"AND STRIKING OUR EAR PRODUCING THE"
1040 [153]"SENSATION WE DESCRIBE AS 'MUSIC'"
1050 [153]"...OR 'NOISE', DEPENDING UPON THE"
1060 [153]"WAY THE CHANGES IN PRESSURE OCCUR.":MS$[178]" NOISE?":[141]63100
1070 [141]63000:[153]"LOADEVEN 'MUSICAL' SOUNDS DIFFER FROM ONE"
1080 [153]"INSTRUMENT TO ANOTHER."
1110 [153]"A SIMPLE 'SCHEME' WHICH DESCRIBES"
1120 [153]"THE DIFFERENCES BETWEEN VARIOUS"
1130 [153]"MUSICAL UNSTRUMENTS IS AS FOLLOWS:"
1140 [153]"WE'LL LOOK AT A 'NOTE' FROM SOME"
1150 [153]"FICTITIOUS MUSICAL INSTRUMENT..":MS$[178]"LET'S LOOK":[141]63100
1155 [141]63000
1160 [153]"LOAD<LENLENLENLENLENATTACKLENLENLENLENLENLENLEN><LENDECAYLEN><LENSUSTAINLEN>":[141]62000:[141]63200
1170 [153]""BL$"THE 'SUSTAIN' PART LASTS AND LASTS.... ":[141]63000
1180 [153]"LOAD":[141]63300:[153]"...UNTIL THE NOTE IS 'RELEASED'."
1190 [153]"LENLENLENLENLENLENLENSUSTAINLENLENLENLENLENLENLEN><LENRELEASELEN>":MS$[178]" ADSRWAIT":[141]63100
1200 [141]63000:[153]"LOADHERE'S ONE COMPLETE NOTE:":[141]63100:[141]63400
1210 [141]63000:[153]"LOADWE CAN TELL THE SWAITOUND"
1220 [153]"IWAITWAITNTERFACE DWAITEVICE (SID CHIP)"
1230 [153]"WHAT WE WANT FOR THE AWAITTTACK, DWAITECAY"
1240 [153]"SWAITUSTAIN AND RWAITELEASE."
1250 [153]"WE HAVE 16 POSSIBLE VALUES FOR EACH,"
1260 [153]"THAT'S 4 BITS WORTH, SO WE CAN SQUEEZE"
1270 [153]"ATTACK/DECAYWAIT INTO ONE REGISTER AND"
1280 [153]"SUSTAIN/RELEASEWAIT INTO ANOTHER REGISTER."
1285 MS$[178]" ADWAIT SRWAIT":[141]63100:[141]63000
1290 [153]"LOADTHE SID CHIP STARTS AT $D400"
1300 [153]"OR SID=54272WAIT."
1310 [153]"IF 0<=AT<=15 AND 0<=DE<=15
1320 PRINT" & 0<=SU<=15 AND 0<=RE<=15
1330 [153]"THEN:
1340 PRINT"POKE SID+5,16*AT+DE"
1350 PRINT"POKE SID+6,16*SU+RE"
1360 MS$=" SID+5 & 6":GOSUB63100:GOSUB63000
1370 PRINT"[147]THE TIME TAKEN TO COMPLETE THE ATTACK[146]"
1380 PRINT"DEPENDS UPON THE VALUE OF AT[146]:0-15."
1390 PRINT"FOR AT=0[146] IT TAKES 2 MILLISECONDS."
1400 PRINT"FOR AT=15[146] IT TAKES 8 SECONDS!"
1410 PRINT"THE 'DECAY' AND 'RELEASE' TIMES ARE"
1420 PRINT"THREE TIMES AS LONG:"
1430 PRINT"DE=0[146] TAKES 6 MILLISECONDS."
1440 PRINT"DE=15[146] TAKES 24 SECONDS!!"
1450 PRINT"(SAME FOR 'RELEASE')."
1460 MS$="24 SECONDS":GOSUB63100:GOSUB63000
1470 PRINT"[147]THE ADSR[146] SETTINGS GIVE THE OUTLINE"
1480 PRINT"OF THE WAVEFORM (THE 'ENVELOPE')."
1490 PRINT"IN ADDITION WE CAN CHOOSE THE FREQUENCY[146]"
1500 PRINT"OF THE OSCILLATIONS:[186][208][186][208][186][208][186][208][186][208][186][208]."
1510 PRINT"BECAUSE OF THE WIDE RANGE IN FREQUENCY"
1520 PRINT"WE NEED 16 BITS OR 2 BYTES TO HOLD THE"
1530 PRINT"FREQUENCY. THIS GIVES 65536 POSSIBLE"
1540 PRINT"FREQUENCIES..UP TO ABOUT 4000 HERTZ.":MS$=" 2 BYTES"
1550 PRINT"POKE SID,LO:POKE SID+1,HI":GOSUB63100:GOSUB63000
1560 PRINT"[147]IF FQ[146] IS THE 'FREQUENCY NUMBER',"
1570 PRINT"WITH 0<=FQ<=65535, THEN:"
1580 PRINT"HI=INT(FQ/256):LO=FQ-256*HI"
1590 PRINT"GIVING THE 2 BYTES FOR SID, SID+1.":MS$="SID,SID+1":GOSUB63100
1600 GOSUB63000:PRINT"[147]EACH 'NUMBER', FQ, CORRESPONDS TO"
1610 PRINT"A 'FREQUENCY', IN CYCLES PER SECOND,"
1620 PRINT"ACCORDING TO THE MAGIC FORMULA:"
1630 PRINT"FQ=ACTUAL FREQUENCY/.059604645[146]."
1640 PRINT"IF YOU WANT TO HEAR 'A' IN THE 4'TH"
1650 PRINT"OCTAVE OF THE PIANO KEYBOARD, THAT'S"
1660 PRINT"440 HERTZ, SO FQ=440/.059604645=7381.97"
1670 PRINT"..LET'S SAY: FQ=7382."
1680 PRINT"THEN: HI=INT(7382/256)=28 "
1690 PRINT" LO=7382-256*HI=214 "
1700 PRINT" POKE SID,214:POKE SID+1,28":GOSUB63000
1710 PRINT"[147]OK..WE'VE GIVEN THE SID CHIP THE ADSR[146]"
1720 PRINT"ENVELOPE, AND THE FREQUENCY NUMBER[146],"
1730 PRINT"NOW WE CHOOSE THE WAVEFORM[146]:"
1740 PRINTTR$TR$TR$" = TRIANGLE"
1750 PRINT""SA$SA$SA$SA$SA$" = SAWTOOTH"
1760 PRINT""PU$PU$PU$" = PULSE":NN=9:GOSUB63500
1770 PRINT""NO$" =":MS$=" NOISE[146]!!!":GOSUB63100:GOSUB63000
1780 PRINT"[147]'NOISE' CONSISTS OF A SEQUENCE"
1790 PRINT"OF PULSES OF RANDOM AMPLITUDE..."
1800 FORL=1TO4:GOSUB63500:PRINT"":FORP=1TO4*L:PRINT"";:NEXT
1810 PRINTNO$;:NEXT:GOSUB63100:GOSUB63000
1820 PRINT"[147]POKE SID+4[146] WITH A 'WAVEFORM NUMBER':WN"
1830 PRINT"TO GET THE DESIRED WAVEFORM."
1840 PRINT""TR$TR$" : POKE SID+4,17"
1850 PRINT""SA$SA$" : POKE SID+4,33"
1860 PRINT""PU$PU$" : POKE SID+4,65"
1870 PRINT""NO$" : POKE SID+4,129"
1880 MS$=" SID+4,WN":GOSUB63100:GOSUB63000:PRINT"";:FORI=1TO4:PRINTBL$:NEXT
1890 PRINT"NOTE THE VALUES OF WN[146]:":PRINT"WN=16+1,32+1,64+1,128+1"
1900 GOSUB63000:PRINT"[147]";:PRINTNN$(1):PRINTNN$(2)" SID+4":PRINTNN$(3)
1910 PRINT"HERE'S THE SID+4[146] REGISTER."
1920 PRINT"FOR "TR$" WE POKE SID+4,17":PRINT"00010001"
1930 GOSUB63000:PRINT"[147]";:PRINTNN$(1):PRINTNN$(2)" SID+4":PRINTNN$(3)
1940 PRINT"HERE'S THE SID+4[146] REGISTER."
1950 PRINT"FOR "SA$" WE POKE SID+4,33":PRINT"00100001"
1960 GOSUB63000:PRINT"[147]";:PRINTNN$(1):PRINTNN$(2)" SID+4":PRINTNN$(3)
1970 PRINT"HERE'S THE SID+4[146] REGISTER."
1980 PRINT"FOR "PU$" WE POKE SID+4,65":PRINT"01000001"
1990 GOSUB63000:PRINT"[147]";:FORI=1TO3:PRINTNN$(I):NEXT
2000 PRINT"HERE'S THE SID+4[146] REGISTER."
2010 PRINT"FOR "NO$" WE POKE SID+4,129":PRINT"10000001"
2020 GOSUB63000:PRINT"[147]";:PRINTNN$(1):PRINTNN$(2)" SID+4":PRINTNN$(3)
2030 GB$="":FORI=1TO5:PRINTGB$"[214]":FORT=1TO100:NEXT
2040 PRINTGB$"[146][214]":FORT=1TO100:NEXT:NEXT
2050 PRINT"THIS BIT, THE GATE BIT[146], WHEN"
2060 PRINT"SET TO '1', STARTS THE NOTE!!"
2070 PRINT"SO BE SURE THE ADSR[146], FREQUENCY #,"
2080 PRINT"AND ANY OTHER PARAMETERS ARE GIVEN"
2090 PRINT"TO SID[146] BEFORE[157][157][157][157][157][157][184][184][184][184][184][184][145] YOU:"
2100 PRINT"POKE SID+4,WN[146]!":GOSUB63000:MS$=" OTHERS?":GOSUB63100
2110 PRINT"[147]IF YOU CHOOSE PULSE[146],"
2120 PRINT"THEN EACH CYCLE[146] CAN BE:"
2130 PRINT"[207][204][175][175][175][175][175][175][175][186]":PRINT"[207][183][204][175][175][175][175][175][175][186]"
2140 PRINT"[207][183][183][204][175][175][175][175][175][186]":PRINT"[207][183][183][208][175][175][175][175][175][186]"
2150 PRINT"[207][183][183][183][208][175][175][175][175][186]":PRINT"[207][183][183][183][183][183][204][175][175][186]"
2160 PRINT"ETC. ETC.":GOSUB63000:MS$="PULSEWIDTH":GOSUB63100:GOSUB63000
2170 PRINT"[147]THE PULSE WIDTH[146] IS GIVEN TO SID[146]"
2180 PRINT"AS A 12 BIT NUMBER:"
2190 PRINT"12 BITS MEANS THERE ARE 2^12=4096"
2200 PRINT"POSSIBLE 'PULSE WIDTHS'."
2210 PRINT"IF 0<=PW<=4095 THEN:"
2220 PRINT"POKE SID+4,PW AND 255:POKE SID+5,PW/256"
2230 PRINT"WHICH FILLS THESE SID REGISTERS WITH"
2240 PRINT"A LOW BYTE AND A HIGH NYBBLE (!)"
2250 MS$=" NYBBLE!":GOSUB63100:GOSUB63000
2260 PRINT"[147]";:PRINTNN$(1)" "N$(1):PRINTNN$(2)"_SID+2"N$(2)"_SID+3"
2270 PRINTNN$(3)" "N$(3)
2280 PRINT" LOW BYTE"SPC(11)"HI NYBBLE"
2290 PRINT"INCREASING PW[146] CHANGES THE PULSES:"
2310 PRINT"[207][204][175][175][175][175][175][175][175][186]":PRINT"[207][183][204][175][175][175][175][175][175][186]"
2320 PRINT"[207][183][183][204][175][175][175][175][175][186]":PRINT"[207][183][183][208][175][175][175][175][175][186]"
2330 PRINT"[207][183][183][183][208][175][175][175][175][186]":PRINT"[207][183][183][183][183][183][204][175][175][186]"
2340 PRINT"ETC. ETC.":GOSUB63000:MS$="DUTY CYCLE":GOSUB63100:GOSUB63000
2350 PRINT"[147]FOR A FRACTION OF EACH CYCLE THE"
2360 PRINT"PULSE IS 'HIGH'...THEN IT'S 'LOW'."
2370 PRINT"THE HIGH FRACTION IS GIVEN BY PW[146]:"
2380 PRINT"HIGH FRACTION = PW/4095":MS$=" 2048=50[146]%":GOSUB63100:GOSUB63000
2390 PRINT"[147]SO FAR WE HAVE:"
2400 PRINT"SID=54272"
2410 PRINT"POKE SID ,LO FREQ NUMBER"
2420 PRINT"POKE SID+1,HI FREQ NUMBER"
2430 PRINT"POKE SID+2,LO PULSE WIDTH"
2440 PRINT"POKE SID+3,HI PULSE WIDTH"
2450 PRINT"POKE SID+5,16*ATTACK+DECAY"
2460 PRINT"POKE SID+6,16*SUSTAIN+RELEASE"
2465 PRINT"POKE SID+24,VOLUME!!!!":GOSUB63000:MS$="VOLUME<16":GOSUB63100
2470 GOSUB63000:MS$="...THEN??":GOSUB63100:GOSUB63000
2480 PRINT"POKE SID+4,WAVEFORM NUMBER"
2490 PRINT"TO TURN ON THE SOUND!!":GOSUB63000:MS$="LET'S TRY!":GOSUB63100
2500 GOSUB63000:PRINT"[147]WE'LL SOUND AN 'A'."
2510 PRINT"THAT HAS A FREQUENCY OF 440 HERTZ."
2520 PRINT"440/.059604645=7382"
2530 PRINT"SO WE SET FQ=7382[146]...."
2540 PRINT"THAT'S THE 'FREQUENCY NUMBER'."
2550 PRINT"WE'LL CHOOSE PULSE[146] WAVEFORM AND"
2560 PRINT"SOME NICE ADSR[146] NUMBERS, ETC.":GOSUB63000:FR=440
2570 FQ=7382:AT=10:DE=2:SU=10:RE=11:PU=3000:WN=65:VOL=15:GOSUB63600
2580 MS$="YOUR TURN!":GOSUB63100:GOSUB63000
2600 PRINT"[147]OK...YOU[157][157][157][184][184][184][145] PICK SOME PARAMETERS:":GOSUB63000
2610 GOSUB63800:GOSUB63600
2620 INPUT"[147]AGAIN Y[157][157][157]";A$:IFA$="Y"THEN2610
2630 PRINT"[147]OK...WAIT...":MS$=" LISTEN":GOSUB63100
2700 GOSUB60000
2705 PRINT"[147]S=54272 [146] SID CHIP BASE"
2710 PRINT"POKE S+5,16*00+0[146] AT=0,DE=0"
2720 PRINT"POKE S+6,16*15+9[146] SU=15,RE=9"
2730 PRINT"POKE S+24,15 [146] VOLUME=15"
2740 PRINT"FORI=1 TO N [146] PLAY N NOTES"
2750 PRINT"READ FQ,D [146] READ FREQ & DURATION"
2760 PRINT"HI=INT(FQ/256) [146] HI FREQ"
2770 PRINT"LO=FQ-256*HI [146] LO FREQ"
2780 PRINT"POKE S,LO [146] POKE LO"
2790 PRINT"POKE S+1,HI [146] POKE HI"
2795 PRINT"WN=17 [146] WAVENUMBER"
2800 PRINT"POKE S+4,WN [146] GATE NOTE ON"
2810 PRINT"FORJ=1TOD:NEXT [146] DURATION "
2820 PRINT"POKE S+4,WN-1 [146] RELEASE NOTE "
2830 PRINT"NEXT [146]"
2835 AT=0:DE=0:SU=15:RE=9:M0=1:PU=2000
2840 M1=10:WN$="":WN=17:PRINTWN$WN:GOSUB10000
2850 M0=M1:M1=20:WN=33:PRINTWN$WN:GOSUB10000
2860 M0=M1:M1=30:WN=65:PRINTWN$WN:GOSUB10000
2865 M0=M1:M1=40:RE=0:RE$=""
2870 WN=17:PRINTWN$WN:FORA=1TO10:PRINTRE$"[214]0"
2871 FORT=1TO50:NEXT:PRINTRE$"0"
2875 FORT=1TO50:NEXT:NEXT:GOSUB10000
2880 WN=33:PRINTWN$WN:FORA=1TO10:PRINTRE$"[214]0"
2881 FORT=1TO50:NEXT:PRINTRE$"0"
2885 FORT=1TO50:NEXT:NEXT:M0=M1:M1=50:GOSUB10000
2890 WN=65:PRINTWN$WN:FORA=1TO10:PRINTRE$"[214]0"
2891 FORT=1TO50:NEXT:PRINTRE$"0"
2895 FORT=1TO50:NEXT:NEXT:M0=M1:M1=60:GOSUB10000
2900 WN=129:PRINTWN$WN:PRINTRE$"0":GOSUB10000
2910 MS$=" NOISE[146]!":GOSUB63100:GOSUB63000
2920 PRINT"[147]OK..NOW LET'S HAVE THREE[146] VOICES":MS$=" THREE?":GOSUB63100
2930 GOSUB63000:PRINT"[147] JESU JOY "
2940 PRINT" WN=17":WN=17
2950 PRINT" AT=0:DE=0":AT=0:DE=0
2960 PRINT" SU=10:RE=9":SU=10:RE=9
2970 GOSUB63000
2980 MV=2:M0=1:M1=67:GOSUB10000
3000 XX=1
3010 PRINT"[147]NOW YOU[157][157][157][184][184][184][145] PICK THE PARAMETERS"
3020 PRINT"FOR THESE THREE[146] VOICES."
3030 PRINT" ATTACK ";AT
3035 INPUT" [145]";AT:AT=AT AND 15
3040 PRINT" DECAY ";DE
3045 INPUT" [145]";DE:DE=DE AND 15
3050 PRINT" SUSTAIN ";SU
3055 INPUT" [145]";SU:SU=SU AND 15
3060 PRINT" RELEASE ";RE
3065 INPUT" [145]";RE:RE=RE AND 15
3070 PRINT" WAVEFORM ";WN
3075 INPUT" [145]";WN:IFWN<>17ANDWN<>33ANDWN<>65ANDWN<>129THEN3075
3080 MV=2:M0=1:M1=31:GOSUB10000
3090 INPUT"AGAIN Y[157][157][157]";A$:IFA$="Y"THENPRINT"":GOTO3030
3100 PRINT"[147]NOW, FOR THREE[146] VOICES!"
3110 PRINT"SID=54272"
3120 PRINT"POKE SID ,LO FREQ NUMBER "
3140 PRINT"POKE SID+1,HI FREQ NUMBER "
3150 PRINT"POKE SID+2,LO PULSE WIDTH "
3160 PRINT"POKE SID+3,HI PULSE WIDTH "
3161 PRINT"POKE SID+4,WAVEFORM NUMBER"
3170 PRINT"POKE SID+5,16*AT+DE "
3180 PRINT"POKE SID+6,16*SU+RE "
3190 PRINT"POKE SID+24,VOL "
3200 PRINT"ALL THIS FOR VOICE #1."
3210 PRINT"...AND,FOR VOICE #2[146]...":GOSUB63000:PRINT""
3220 Z$(0)="POKE SID+7,LO FREQ NUMBER "
3240 Z$(1)="POKE SID+8,HI FREQ NUMBER "
3250 Z$(2)="POKE SID+9,LO PULSE WIDTH "
3260 Z$(3)="POKE SID+10,WAVEFORM NUMBER"
3265 Z$(4)="POKE SID+11,HI PULSE WIDTH "
3270 Z$(5)="POKE SID+12,16*AT+DE "
3280 Z$(6)="POKE SID+13,16*SU+RE "
3290 Z$(7)="POKE SID+24,VOL _SAME! "
3300 FORI=0TO7:L=LEN(Z$(I)):FORJ=1TOL:PRINT"";
3310 PRINTMID$(Z$(I),J,1);:FORT=1TO10:NEXT:NEXT:PRINT:NEXT
3320 FORI=1TO5:PRINTBL$:NEXT:MS$="& VOICE3?":GOSUB63100:GOSUB63000:PRINT""
3330 Z$(0)="POKE SID+14,LO FREQ NUMBER "
3340 Z$(1)="POKE SID+15,HI FREQ NUMBER "
3350 Z$(2)="POKE SID+16,LO PULSE WIDTH "
3360 Z$(3)="POKE SID+17,HI PULSE WIDTH "
3365 Z$(4)="POKE SID+18,WAVEFORM NUMBER"
3370 Z$(5)="POKE SID+19,16*AT+DE "
3380 Z$(6)="POKE SID+20,16*SU+RE "
3390 Z$(7)="POKE SID+24,VOL _SAME! "
3400 FORI=0TO7:L=LEN(Z$(I)):FORJ=1TOL
3410 PRINTMID$(Z$(I),J,1);:FORT=1TO10:NEXT:NEXT:PRINT:NEXT
3420 GOSUB63000
3430 PRINT"[147]JUST DO:"
3440 PRINT"SID=54272"
3445 PRINT"FOR VC=0 TO 2"
3450 PRINT"POKE SID+7*VC ,LO FREQ NUMBER "
3460 PRINT"POKE SID+7*VC+1,HI FREQ NUMBER "
3470 PRINT"POKE SID+7*VC+2,LO PULSE WIDTH "
3480 PRINT"POKE SID+7*VC+3,HI PULSE WIDTH "
3490 PRINT"POKE SID+7*VC+4,WAVEFORM NUMBER"
3500 PRINT"POKE SID+7*VC+5,16*AT+DE "
3510 PRINT"POKE SID+7*VC+6,16*SU+RE "
3515 PRINT"NEXT VC"
3520 PRINT"POKE SID+24,VOL "
3530 GOSUB63000:PRINT"BUT DON'T START THE NOTE TOO EARLY!!!"
3540 A$=" ":L=LEN(A$):PRINT"";
3550 FORI=1TOL:PRINTMID$(A$,I,1);:FORT=1TO100:NEXT:NEXT:PRINT
3560 A$="POKE SID+7*VC+4,WAVEFORM NUMBER":PRINT"";
3570 FORI=1TOL:PRINTMID$(A$,I,1);:FORT=1TO100:NEXT:NEXT:PRINT
3580 MS$="NOW START!":GOSUB63100:GOSUB63000:PRINT"[147]SETUP:"
3600 PRINT"SID=54272 [146]"
3610 PRINT"FOR VC=0 TO 2 [146]"
3620 PRINT"POKE SID+7*VC ,0 [146]:LO FREQ=0"
3630 PRINT"POKE SID+7*VC+1,0 [146]:HI FREQ=0"
3640 PRINT"POKE SID+7*VC+2,160 [146]:HI PULSE"
3650 PRINT"POKE SID+7*VC+3,15 [146]:LO PULSE"
3660 PRINT"POKE SID+7*VC+4,0 [146]:TURN OFF!"
3670 PRINT"POKE SID+7*VC+5,16*0+0 [146]:AT=0:DE=0"
3680 PRINT"POKE SID+7*VC+6,16*10+9[146]:SU=10:RE=9"
3690 PRINT"NEXT VC [146]"
3695 PRINT"POKE SID+24,15:WN=65 [146]:PULSE"
3700 PRINT"PLAY:"
3710 PRINT"READ FL,FH,DU [146]:FREQ & DURATION"
3720 PRINT"POKE SID+7*VC,FL [146]:POKE LO FREQ"
3730 PRINT"POKE SID+7*VC+1,FH [146]:POKE HI FREQ"
3740 PRINT"POKE SID+7*VC+4,WN [146]:GATE IT"
3750 PRINT"FOR T=1 TO DU:NEXT [146]:DURATION"
3760 PRINT"VC=VC+1:IFVC=2THENVC=0[146]:NEXT VOICE!"
3770 PRINT"POKE SID+7*VC+1,WN-1 [146]:STOP IT!"
3780 PRINT"REPEAT ABOVE.."
4000 M0=1:M1=103:PU=2000:WN=65:AT=5:DE=2:SU=10:RE=3
4010 MV=2:XX=2:GOSUB10000
9999 GOSUB63000:PRINT"[147]":MS$="AU REVOIR!":GOSUB63100:PRINT"":END
10000 IFPU=0THENPU=4000
10001 S=54272:FORVV=0TO2:POKES+5+7*VV,16*AT+DE:POKES+6+7*VV,16*SU+RE
10002 POKES+2+7*VV,PUAND255:POKES+3+7*VV,PU/256:POKES+7*VV,0:POKES+1+7*VV,0
10003 NEXT:POKES+24,15:QQ=2^(1/12)
10004 IFXX=2THEN10010
10005 PRINT""BL$:PRINTBL$:PRINT"[145][145]"
10006 IFWN=17THENPRINT" "TR$TR$TR$TR$
10007 IFWN=33THENPRINT" "SA$SA$SA$SA$
10008 IFWN=65THENPRINT" "PU$PU$PU$PU$
10009 IFWN=129THENPRINT" "NO$
10010 FORI=M0TOM1:FR=2000*(QQ^N(I))
10020 HI=INT(FR/256):LO=FR-256*HI:POKES+7*VC,LO:POKES+1+7*VC,HI:POKES+4+7*VC,WN
10030 FORJ=1TO50*P(I):NEXT:VC=VC+1:IFVC>MVTHENVC=0
10035 POKES+4+7*VC,WN-1
10040 NEXT:FORVV=0TO2:POKES+4+7*VV,0:NEXT:FORT=1TO500:NEXT:IFXX=0THENGOSUB63000
10050 RETURN
50000 REM JESU JOY
50001 RESTORE
50002 READ M
50003 DIM N(M),P(M)
50005 FORI=1TOM
50006 READN(I),P(I):NEXT:RETURN
50009 DATA 103
50010 DATA12,2,8,2,10,2,12,2,15,2,13,2,13,2,17,2,15,2,15,2
50011 DATA20,2,19,2,20,2,15,2,12,2,8,2,10,2,12,2,13,2,15,2
50012 DATA17,2,15,2,13,2,12,2,10,2,12,2,8,2,7,2,8,2,10,2
50013 DATA3,2,7,2,10,2,13,2,12,2,10,2,12,2,8,2,10,2,12,2
50014 DATA15,2,13,2,13,2,17,2,15,2,15,2,20,2,19,2,20,2,15,2
50015 DATA12,2,8,2,10,2,12,2,5,2,15,2,13,2,12,2,10,2,8,2
50016 DATA3,2,8,2,7,2,8,2,12,2,15,2,20,2,15,2,12,2,8,2
50017 DATA12,2,15,2,18,2,15,2,12,2,8,2,12,2,15,2,17,2,13,2
50018 DATA10,2,7,2,10,2,13,2,15,2,12,2,8,2,5,2,8,2,12,2
50019 DATA13,2,10,2,7,2,3,2,7,2,10,2,13,2,12,2,10,2,8,2
50020 DATA12,2,15,2,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
60000 REM INITIALIZE
60001 BT$="":FORI=1TO24:BT$=BT$+"":NEXT
60002 PT$="[176][192][192][192][192][192][192][192][192][192][192][174][157][157][157][157][157][157][157][157][157][157][157][157][221][221][157][157][157][157][157][157][157][157][157][157][157][157][173][178][192][192][192][192][192][192][192][192][178][189]"
60003 PT$=PT$+"[157][157][157][157][157][157][157][157][157][157][157][157][157][206][163][163][163][163][163][163][163][163][163][163][163][163][205][157][157][157][157][157][157][157][157][157][157][157][157][157][157][165]============[167]"
60004 PT$=PT$+"[157][157][157][157][157][157][157][157][157][157][157][157][157][157][208][207][163][163][163][163][163][163][163][163][163][163][208][207][145][145][145][145][157][157][157][157][157][157][157][157][157][157][157][157]"
60005 PT$=BT$+"[145][145][145][145][145][145]"+PT$+"[144]"
60007 BL$=" "
60008 WD=40:CRT=1024
60009 POKE53281,1:POKE53280,15:PRINT"[144]"
60010 V=53248:FORI=0TO16:POKEV+I,0:NEXT
60011 POKEV+23,0:POKEV+29,0:FORI=0TO7:POKEV+39+I,0:NEXT
60012 N$(1)="[176][192][178][192][178][192][178][192][174]"
60013 N$(2)="[221] [221] [221] [221] [221]"
60014 N$(3)="[173][192][177][192][177][192][177][192][189]"
60015 NN$(1)="[176][192][178][192][178][192][178][192][178][192][178][192][178][192][178][192][174]"
60016 NN$(2)="[221] [221] [221] [221] [221] [221] [221] [221] [221]"
60017 NN$(3)="[173][192][177][192][177][192][177][192][177][192][177][192][177][192][177][192][189]"
60020 R$="[176][178][178][178][178][178][178][178][174][157][157][157][157][157][157][157][157][157][173][177][177][177][177][177][177][177][189][145]"
60030 L$="- - - - - - - - -"
60040 PS$=""
60050 DN$=""
60060 BMM$="":MCM$="":SMB$=""
60070 CMB$=SMB$+"":CL$=" "
60080 DN$=DN$+CL$+DN$
60090 SC$=SMB$+""
60100 CH$=SC$+""
60110 DD$="":DD$=DD$+CL$+DD$
60120 TR$="[206][145][206][205][205]"
60130 SA$="[206][145][206][165][157][204]"
60140 PU$="[165][145][157][207][208][157][167][164][164][164][164][157]":NN=9
60200 GOSUB62005:GOSUB63500:RETURN
62000 :
62005 U$="[180][145][157]":D$="[180][157]":T$="[207][180][157]":B$="[204][180][145][157]"
62010 A$(0)="[175]"
62011 A$(1)=T$+B$:U=1:D=2:FORJ=2TO10
62012 A$="":FORI=1TOU:A$=A$+U$:NEXT:A$=A$+T$:FORI=1TOD:A$=A$+D$:NEXT
62013 A$=A$+B$:FORI=1TOU:A$=A$+U$:NEXT:A$(J)=A$:U=U+1:D=2*U:NEXT
62015 FORJ=1TO5:D$(J)=A$(10-J):NEXT
62016 SS$=D$(5)
62017 FORI=1TO5:R$(I)=A$(5-I):NEXT
62020 RETURN
63000 PRINT"HIT RETURN[146] TO CONTINUE";
63001 GETA$:IFA$<>""THEN63001
63002 GETA$:IFA$=""THEN63002
63003 RETURN
63004 RETURN
63100 FORT=1TO5:PRINTPT$MS$;
63101 PRINTPT$" ";
63102 PRINTPT$MS$;:NEXT
63103 PRINT"[144]":RETURN
63200 PRINT"":FORI=0TO10:FORJ=1TOLEN(A$(I))
63205 PRINTMID$(A$(I),J,1);:NEXT:NEXT
63210 FORI=0TO5:FORJ=1TOLEN(D$(I))
63215 PRINTMID$(D$(I),J,1);:NEXT:NEXT
63220 FORI=0TO3:FORJ=1TOLEN(SS$)
63225 PRINTMID$(SS$,J,1);:NEXT:NEXT
63230 RETURN
63300 PRINT""
63305 FORI=0TO10:FORJ=1TOLEN(SS$)
63310 PRINTMID$(SS$,J,1);:NEXT:NEXT
63320 FORI=0TO4:FORJ=1TOLEN(R$(I))
63330 PRINTMID$(R$(I),J,1);:NEXT:NEXT
63340 FORI=1TO3:PRINTA$(0);:NEXT:RETURN
63400 PRINT"":FORI=3TO10:PRINTA$(I);:NEXT
63410 FORI=1TO5:PRINTD$(I);:NEXT
63420 FORI=0TO2:PRINTSS$;:NEXT
63430 FORI=1TO4:PRINTR$(I);:NEXT
63450 PRINT"-----A[146]TTACK------D[146]ECAY--S[146]USTAIN--R[146]ELEASE":RETURN
63500 U$="[221][145][157]":D$="[221][157]"
63510 A$="":FORI=1TONN:K=1+4*RND(1):FORJ=1TOK:A$=A$+U$:NEXT:A$=A$+"[176][174][157]"
63520 FORJ=1TOK:A$=A$+D$:NEXT:A$=A$+"[145][173]":NEXT:NO$=A$:RETURN
63600 PRINT"[147]SID=54272":SID=54272
63605 IFXX=0THEN GOSUB63000
63610 PRINT"HI=INT("FQ"/256)":HI=INT(FQ/256)
63615 IFXX=0THENGOSUB63000
63620 PRINT"LO="FQ"-256*HI":LO=FQ-256*HI
63625 IFXX=0THENGOSUB63000
63630 PRINT"POKE SID ,LO":POKESID,LO
63635 IFXX=0THENGOSUB63000
63640 PRINT"POKE SID+1,HI":POKESID+1,HI
63645 IFXX=0THENGOSUB63000
63646 IFPU=0THEN63680
63650 PRINT"PULSE="PU
63655 IFXX=0THENGOSUB63000
63660 PRINT"POKE SID+2,PULSE AND 255":POKESID+22,PUAND255
63665 IFXX=0THENGOSUB63000
63670 PRINT"POKE SID+3,PULSE/256":POKESID+3,PU/256
63675 IFXX=0THENGOSUB63000
63680 PRINT"AT="AT":DE="DE":SU="SU":RE="RE
63681 IFXX=0THENGOSUB63000
63685 PRINT"POKE SID+5,16*AT+DE":POKESID+5,16*AT+DE
63686 IFXX=0THENGOSUB63000
63690 PRINT"POKE SID+6,16*SU+RE":POKESID+6,16*SU+RE
63695 IFXX=0THENGOSUB63000
63700 PRINT"VOLUME="VOL
63705 IFXX=0THENGOSUB63000
63710 PRINT"POKE SID+24,VOLUME":POKESID+24,VOL
63715 IFXX=0THENGOSUB63000
63720 PRINT"WN="WN
63725 IFXX=0THENGOSUB63000
63726 FORXX=1TO3
63727 PRINT" "
63730 PRINT"POKE SID+4,WN :REM GATE IT!":POKESID+4,WN
63735 FORT=1TO1000:NEXT
63736 PRINT" "
63740 PRINT"POKE SID+4,WN-1:REM RELEASE IT!!":POKESID+4,WN-1
63741 FORT=1TO1000:NEXT:NEXT
63745 GOSUB63000:POKESID+24,0:PU=0:RETURN
63800 PRINT"[147]FREQ (HERTZ)= "FR:INPUT"[145]";FR:IFFR>3900THEN63800
63801 FQ=INT(FR/.059604645+.5):PRINT"FQ="FQ
63805 PRINT"WAVEFORM (T[146]RIANGLE,S[146]AWTOOTH,P[146]ULSE"
63806 GETWN$:IFWN$=""THEN63806
63810 IFWN$="T"THENWN=17:GOTO63825
63815 IFWN$="S"THENWN=33:GOTO63825
63820 IFWN$="P"THENWN=65:GOTO63825
63821 GOTO63806
63825 PRINT"WN="WN:IFWN<>65THEN63835
63830 PRINT"PULSE WIDTH= ";PU
63831 INPUT"[145]";PU
63835 PRINT"ATTACK= ";AT
63836 INPUT"[145]";AT
63837 PRINT"DECAY = ";DE
63838 INPUT"[145]";DE
63840 PRINT"SUSTAIN = ";SU
63841 INPUT"[145]";SU
63842 PRINT"RELEASE = ";RE
63843 INPUT"[145]";RE
63845 INPUT"VOLUME 15[157][157][157][157]";VOL
63850 RETURN